home *** CD-ROM | disk | FTP | other *** search
/ Go64! / Go64_1998-08_1998_CSW_Side_A.d64 / scsi list 3 < prev    next >
Text File  |  2023-02-26  |  13KB  |  352 lines

  1.  
  2.  
  3. 1000 rem ---------------------------------------------------------------------
  4. 1010 rem                      scsi listing 3
  5. 1020 rem            basic 7.0 (c) by achim taege 1997
  6. 1030 rem ---------------------------------------------------------------------
  7. 1040 graphic 1,1
  8. 1050 fast:graphic 5,1
  9. 1060 print chr$(147);chr$(14)        :rem screnn loeschen u. klein/gross
  10. 1070 bd=peek(186)
  11. 1080 dim ty$(8),se(27),pu(9)
  12. 1090 ty$(0)="Plattenlaufwerk":ty$(1)="Bandlaufwerk":ty$(3)="Drucker"
  13. 1100 ty$(4)="Worm-Platte":ty$(5)="CD-ROM":ty$(6)="Scanner"
  14. 1110 ty$(7)="Optischer-Speicher":ty$(8)="Medienwechsler"
  15. 1120 :
  16. 1130 for i=0 to 9:pu(i)=8192+256*i:next
  17. 1140 for i=0 to 79:l$=l$+" ":z$=z$+"-":next
  18. 1150 :
  19. 1160 dopen#1,"cd.ib.ascii.sys",u(bd)
  20. 1162 for i=0 to 255:get#1,a$:poke pu(9)+i,asc(a$):next
  21. 1164 dclose#1
  22. 1190 goto 60000                      :rem zum hauptprg.
  23. 2000 rem ---------- scsi-kommando  inquiry 6 byte -----------
  24. 2010 sc$=chr$(18)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(32)+chr$(0)
  25. 2020 gosub 4000:return                            :rem befehl senden
  26. 2030 :
  27. 2040 rem ---------- scsi-kommando  test unit ready 6 byte ---
  28. 2050 sc$=chr$(0)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(0)+chr$(0)
  29. 2060 gosub 4000:return                            :rem befehl senden
  30. 2070 :
  31. 2080 rem ---------- scsi-kommando read capacity 10 byte -----
  32. 2090 sc$=chr$(37)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(0)
  33. 2100 sc$=sc$+chr$(0)+chr$(0)+chr$(0)+chr$(0)+chr$(0)
  34. 2110 gosub 4000:return                            :rem befehl senden
  35. 2120 :
  36. 2130 rem ---------- calc scsi block nummer ------------------
  37. 2140 nn=bn
  38. 2150 a3=int(nn/256^3):nn=nn-a3*256^3
  39. 2160 a2=int(nn/256^2):nn=nn-a2*256^2
  40. 2170 a1=int(nn/256)  :a0=nn-a1*256
  41. 2180 return
  42. 2190 :
  43. 2200 rem ---------- read scsi block 10 byte -----------------
  44. 2210 gosub 2130                                   :rem  calc block
  45. 2220 sc$=chr$(40)+chr$(lu*32)+chr$(a3)+chr$(a2)+chr$(a1)
  46. 2230 sc$=sc$+chr$(a0)+chr$(0)+chr$(0)+chr$(1)+chr$(0)
  47. 2240 gosub 4000:return                            :rem befehl senden
  48. 2250 :
  49. 3000 rem ---------- get byte aus puffer ---------------------
  50. 3010 bc=peek(pu+zt):bc$=chr$(peek(pu(9)+peek(pu+zt)))
  51. 3020 va=va+1:fe=0:if va>=ve then fe=1:return
  52. 3030 zt=zt+1:if zt=(bl-1) then bn=bn+1:gosub 2200:gosub 9000:zt=0
  53. 3040 return
  54. 3050 :
  55. 4000 rem ---------- scsi-kommando request sense 6 byte ------
  56. 4010 gosub 4110
  57. 4015 if fe=0 then begin          :rem fe=0 kein request sense noetig
  58. 4020 : se=0:se(0)=0:se(2)=0:se(12)=0:se(13)=0:goto 6160
  59. 4022 bend
  60. 4025 se=fe
  61. 4030 sc$=chr$(3)+chr$(lu*32)+chr$(0)+chr$(0)+chr$(27)+chr$(0)
  62. 4040 gosub 4110                  :rem senden
  63. 4050 open 15,dv,15
  64. 4060 :print#15,"m-r"+chr$(ml)+chr$(mh)+chr$(14)
  65. 4070 :for f=0 to 13:get#15,a$:se(f)=asc(a$):next
  66. 4080 close 15
  67. 4090 goto 6160                   :rem scsi error
  68. 4100 :
  69. 4110 rem ---------- send scsi-kommando -----------------------------
  70. 4120 gosub 4160
  71. 4130 if fe>0 then gosub 4160
  72. 4140 return
  73. 4150 :
  74. 4160 open 15,dv,15
  75. 4170 :print#15,"s-c"+chr$(id)chr$(ml)chr$(mh)sc$   :rem kommando senden
  76. 4180 :get#15,fe$:fe=asc(fe$)                       :rem fehler status holen
  77. 4190 close 15
  78. 4200 return
  79. 4210 :
  80. 5000 rem -------------- scann cbm-bus for cmd-hd ------------------
  81. 5010 print "suche nach CMD-HD"
  82. 5020 :
  83. 5030 for ga=8 to 30                  :rem geraeteadr. 8 bis 30 testen
  84. 5040 : open 15,ga,15                 :rem geraet oefnen und gleich wieder
  85. 5050 : close 15                      :rem schliessen damit st gesetzt wird
  86. 5060 : if st<>-128 then begin        :rem -128 = device not present
  87. 5070 :  open 15,ga,15                :rem st=0 geraet ist vorhanden
  88. 5080 :  print#15,"uj"                :rem reset ausloesen
  89. 5090 :  input#15,fe,fe$              :rem fehler nr und string lesen
  90. 5100 :  close 15
  91. 5110 :  if instr(fe$,"cmd hd")>0 then begin
  92. 5120 :   dv=ga                       :rem cmd-hd gefunden
  93. 5130 :   ga=30:fe=0                  :rem for-next schleife beenden
  94. 5140 :   print "CMD-HD ist Drive ";dv;"":print
  95. 5150 :  bend:else fe=1
  96. 5160 : bend
  97. 5170 next
  98. 5180 return
  99. 5190 :
  100. 5200 rem --------------- scann scsi-bus for scsi-device --------------------
  101. 5210 print "suche nach SCSI-Devices"
  102. 5220 dp=48*256                      :rem scsi datenpuffer
  103. 5230 mh=48:ml=0                     :rem h.byte u. l.byte des scsi datenpuffers
  104. 5240 :
  105. 5250 sd=0:sl=0                      :rem scsi id u. lun vorbelegen
  106. 5260 :id=sd:lu=sl
  107. 5270 :gosub 2000                    :rem inquiry
  108. 5280 :if fe=0 then begin                         :rem 1 byte aus puffer lesen
  109. 5290 : open 15,dv,15,"m-r"+chr$(ml)+chr$(mh)+chr$(1)
  110. 5300 : get#15,ty$:ty=(asc(ty$) and 31)           :rem scsi geraeteklasse
  111. 5305 : close 15
  112. 5310 : if ty=5 then begin                        :rem cd/drive gefunden
  113. 5410 :  gosub 2040                               :rem test unit ready
  114. 5420 :  if fe=2 then print:"Unit ist nicht READY":end
  115. 5440 :  gosub 2080                               :rem get capacity
  116. 5450 :  if fe=0 then begin
  117. 5460 :   open 15,dv,15,"m-r"+chr$(ml)+chr$(mh)+chr$(8)
  118. 5470 :   get#15,c3$,c2$,c1$,c0$,l3$,l2$,l1$,l0$  :rem 8 byte lesen
  119. 5480 :   close 15
  120. 5490 :   ca=(asc(c3$)*256^3)+(asc(c2$)*256^2)+(asc(c1$)*256)+asc(c0$)+1
  121. 5500 :   bl=(asc(l3$)*256^3)+(asc(l2$)*256^2)+(asc(l1$)*256)+asc(l0$)-1
  122. 5510 :   lu=sl:id=sd:sl=7:sd=8
  123. 5530 :  bend
  124. 5540 : bend
  125. 5560 :bend
  126. 5570 :sl=sl+1:if sl=8 then sl=0:sd=sd+1
  127. 5580 if sd<8 then 5260
  128. 5590 return
  129. 5600 :
  130. 6000 rem -------------- clr screen ---------------------------
  131. 6010 window 0,0,79,24,1:print chr$(14);
  132. 6020 t$="CD-ROM-MON v1.0 (c) by Achim Taege 1997"
  133. 6030 print z$
  134. 6040 print tab(40-len(t$)/2);"";t$;""
  135. 6050 print z$:print:print z$
  136. 6060 window 0,21,79,21,0:print chr$(27)+"m";chr$(14);
  137. 6070 print z$
  138. 6080 return
  139. 6090 :
  140. 6100 rem ------------- akt screen ----------------------------
  141. 6110 window 0,3,79,3,1:print chr$(27)+"m";chr$(14);
  142. 6120 print "Akt. Block NR. > ";bn;"<"
  143. 6130 print tab(35) "Lesen >Ls Vd Pt Rd<"
  144. 6140 return
  145. 6150 :
  146. 6160 rem ------------- scsi error ausg. ----------------------
  147. 6170 window 0,22,39,24,1:print chr$(27)+"m";chr$(14);
  148. 6180 print "SCSI-ERROR NR. > ";se;"<"
  149. 6190 print "ERROR-CODE     > ";right$(hex$(se(0)),2);" <"
  150. 6195 print "SENSE-CODES    > ";right$(hex$(se(2)),2);".";
  151. 6196 print  right$(hex$(se(12)),2);".";right$(hex$(se(13)),2);" <"
  152. 6197 return
  153. 6199 :
  154. 6200 rem ------------- init screen ---------------------------
  155. 6210 bn=0:fe=0:pu=pu(0)
  156. 6220 gosub 6000:gosub 6100:gosub 6160
  157. 6230 return
  158. 6240 :
  159. 6300 rem ------------ print puffer ---------------------------
  160. 6310 :
  161. 6320 window 6,5,79,20,1:print chr$(27)+"m";chr$(14);
  162. 6330 :
  163. 6340 :
  164. 6350 for a=0 to 255 step 16
  165. 6360 :for i=a to a+15
  166. 6370 : print right$(hex$(peek(pu+i)),2);" ";
  167. 6380 :next
  168. 6390 :print "{SHIFT--} ";
  169. 6400 :for i=a to a+15
  170. 6410 : print chr$(peek(pu(9)+peek(pu+i)));
  171. 6420 :next
  172. 6430 :print
  173. 6440 next
  174. 6450 return
  175. 6460 :
  176. 6500 rem ------------- get block nr --------------------------
  177. 6510 window 40,22,79,22,1:print chr$(27)+"m";chr$(14);
  178. 6520 input "Block Nr. > ";bn$:if bn$="" then 6500
  179. 6530 bn=val(bn$)
  180. 6540 if (bn<0 or bn>ca) then 6510
  181. 6550 window 40,23,79,23,1
  182. 6560 return
  183. 6570 :
  184. 6600 rem ------------ print pu ascii -------------------------
  185. 6610 for by=a to e
  186. 6620 :print chr$(peek(pu(9)+peek(pu+by)));
  187. 6630 next
  188. 6640 return
  189. 6650 :
  190. 9000 rem ------------- get hd ram ---------------------------
  191. 9020 ba=int(bl/256)
  192. 9030 open 15,dv,15
  193. 9040 for b=0 to ba
  194. 9050 :print#15,"m-r"+chr$(ml)+chr$(mh+b)+chr$(0)
  195. 9060 :for i=0 to 255:get#15,a$:poke pu(b)+i,asc(a$):next
  196. 9070 next
  197. 9080 close 15
  198. 9100 return
  199. 9110 :
  200. 10000 rem ------------- read and disp sektor -----------------
  201. 10010 gosub 6500
  202. 10020 gosub 6100
  203. 10030 gosub 2200
  204. 10035 if fe=0 then begin
  205. 10040 :gosub 9000
  206. 10110 :b=0
  207. 10120 :pu=pu(b):gosub 6300
  208. 10130 :get key x$
  209. 10140 :if (x$<>chr$(27) and x$<>chr$(13)) then 10130
  210. 10150 :if x$=chr$(13) then begin
  211. 10160 :  b=b+1
  212. 10170 :  if b<=ba then 10120
  213. 10180 :bend
  214. 10185 bend
  215. 10190 return
  216. 10200 :
  217. 49000 rem ----------- vd lesen -------------------------------
  218. 49010 bn=16                :rem vd immer ab sektor 16
  219. 49020 gosub 6100
  220. 49030 gosub 2200           :rem lesen
  221. 49040 if fe=0 then begin
  222. 49050 :bl=255              :rem nur 256 byte von interesse
  223. 49060 :gosub 9000          :rem einlesen
  224. 49110 :b=0
  225. 49120 :pu=pu(b)-1          :rem -1 weil die bytes ab 1 nummeriert sind
  226. 49130 :ca=peek(pu+81)+peek(pu+82)*256+peek(pu+83)*256^2+peek(pu+84)*256^3
  227. 49140 :bl=peek(pu+129)+peek(pu+130)*256
  228. 49150 :pl=peek(pu+133)+peek(pu+134)*256+peek(pu+135)*256^2+peek(pu+136)*256^3
  229. 49160 :ps=peek(pu+141)+peek(pu+142)*256+peek(pu+143)*256^2+peek(pu+144)*256^3
  230. 49170 :rs=peek(pu+159)+peek(pu+160)*256+peek(pu+161)*256^2+peek(pu+162)*256^3
  231. 49180 :rl=peek(pu+167)+peek(pu+168)*256+peek(pu+169)*256^2+peek(pu+170)*256^3
  232. 49190 bend
  233. 49200 return
  234. 49210 :
  235. 50000 rem ----------- vd anzeigen ----------------------------
  236. 50010 gosub 49000          :rem vd lesen
  237. 50020 if fe=0 then begin
  238. 50030 :window 0,5,79,20,1:print chr$(27)+"l";chr$(14);
  239. 50040 :print "VD-Type          > ";:a=1
  240. 50050 :if peek(pu+a)=0   then print "Boot Record"
  241. 50060 :if peek(pu+a)=1   then print "Primary VD"
  242. 50070 :if peek(pu+a)=2   then print "Supplementary VD"
  243. 50080 :if peek(pu+a)=3   then print "Volume Partition VD"
  244. 50090 :if peek(pu+a)=255 then print "VD set Terminator"
  245. 50100 :print "Identifier       > ";:a=2:e=6:gosub 6600:print
  246. 50110 :print "Volume ID        > ";:a=41:e=72:gosub 6600:print
  247. 50120 :print "Belegte Sektoren >";ca
  248. 50130 :print "Sektorlaenge     >";bl
  249. 50140 :print "Pathtable Start  >";ps
  250. 50150 :print "Pathtable Laenge >";pl
  251. 50160 :print "Root Dir  Start  >";rs
  252. 50170 :print "Root Dir  Laenge >";rl
  253. 50180 :get key x$
  254. 50190 :window 0,5,79,20,1
  255. 50200 bend
  256. 50210 return
  257. 50220 :
  258. 51000 rem ------------- pathtable lesen ----------------------
  259. 51010 gosub 49000                 :rem vd lesen
  260. 51020 bn=ps                       :rem ps = pathtable start sektor
  261. 51030 gosub 6100
  262. 51040 pu=pu(0):vn=1               :rem puffer und nr des ersten verz.
  263. 51045 zt=0:va=0:ve=pl:gosub 2200:gosub 9000:rem ersten sektor lesen
  264. 51050 window 0,5,79,20,1:print chr$(27)+"l";chr$(14);
  265. 51060 gosub 3000:nl=bc            :rem erstes byte lesen laenge des namens
  266. 51070 if fe=0 then begin
  267. 51080 :gosub 3000                 :rem byte zwei ist unbelegt
  268. 51090 :gosub 3000:d1=bc
  269. 51100 :gosub 3000:d2=bc
  270. 51110 :gosub 3000:d3=bc
  271. 51120 :gosub 3000:d4=bc
  272. 51130 :po=d1+d2*256+d3*256^2+d4*256^3
  273. 51140 :print "Nr.>";vn;" < Verzeichnislage >";po;"< ";:vn=vn+1
  274. 51150 :gosub 3000:d1=bc
  275. 51160 :gosub 3000:d2=bc
  276. 51170 :po=d1+d2*256:z=8
  277. 51180 :print "Parent Dir >";po;"< Name > ";
  278. 51190 :for ni=1 to nl
  279. 51200 : gosub 3000:print bc$;:z=z+1
  280. 51210 :next
  281. 51220 :print:if int(z/2)*2<>z then gosub 3000
  282. 51230 :goto 51060
  283. 51240 bend
  284. 51250 get key x$
  285. 51260 window 0,5,79,20,1:print chr$(27)+"m";chr$(14);
  286. 51270 return
  287. 51280 :
  288. 52000 rem --------------- dir lesen ------------------------------
  289. 52010 gosub 49000                 :rem vd lesen
  290. 52020 bn=rs                       :rem rs = rootdir start
  291. 52030 gosub 6100
  292. 52040 pu=pu(0)
  293. 52050 zt=0:va=0:ve=rl:gosub 2200:gosub 9000:rem ersten sektor lesen
  294. 52060 window 0,5,79,20,1:print chr$(27)+"l";chr$(14);
  295. 52070 gosub 3000:ee=bc            :rem el = eintragslaenge
  296. 52080 if (fe=0 and ee>0)then begin
  297. 52090 :gosub 3000                 :rem byte zwei ist unbelegt
  298. 52100 :gosub 3000:d1=bc
  299. 52110 :gosub 3000:d2=bc
  300. 52120 :gosub 3000:d3=bc
  301. 52130 :gosub 3000:d4=bc
  302. 52140 :po=d1+d2*256+d3*256^2+d4*256^3
  303. 52150 :print "Start>";po;"<";
  304. 52160 :gosub 3000:gosub 3000:gosub 3000:gosub 3000:rem bytes 7-10 ueberlesen
  305. 52170 :gosub 3000:d1=bc
  306. 52180 :gosub 3000:d2=bc
  307. 52190 :gosub 3000:d3=bc
  308. 52200 :gosub 3000:d4=bc
  309. 52210 :po=d1+d2*256+d3*256^2+d4*256^3
  310. 52220 :print "Laenge>";po;"<";
  311. 52230 :gosub 3000:gosub 3000:gosub 3000:gosub 3000:rem bytes 15-18 ueberlesen
  312. 52240 :print "vom>";
  313. 52250 :gosub 3000:print bc;",";
  314. 52260 :gosub 3000:print bc;",";
  315. 52270 :gosub 3000:print bc;",";
  316. 52280 :gosub 3000:print bc;",";
  317. 52290 :gosub 3000:print bc;",";
  318. 52300 :gosub 3000:print bc;",";
  319. 52310 :gosub 3000:print bc;"<";
  320. 52320 :gosub 3000:gosub 3000:gosub 3000:rem bytes 26-28 ueberlesen
  321. 52330 :gosub 3000:gosub 3000:gosub 3000:gosub 3000:rem bytes 29-32 ueberlesen
  322. 52340 :gosub 3000:nl=bc:z=33           :rem laenge des namens
  323. 52350 :print "Name>";
  324. 52360 :for i=1 to nl:gosub 3000:print bc$;:z=z+1:next
  325. 52370 :print:if int(z/2)*2<>z then gosub 3000
  326. 52380 :goto 52070
  327. 52390 bend
  328. 52400 get key x$
  329. 52410 window 0,5,79,20,1:print chr$(27)+"m";chr$(14);
  330. 52420 return
  331. 52430 :
  332. 60000 rem -------------- hauptprg. ---------------------------
  333. 60010 :
  334. 60020 gosub 5000                   :rem scann cbm-bus
  335. 60030 if fe>0 then end
  336. 60040 gosub 5200                   :rem scann scsi-bus
  337. 60050 gosub 6200                   :rem init screen
  338. 60060 window 40,22,79,22,1:print chr$(27)+"m";chr$(14);
  339. 60070 input "Aktion Lb/Vd/Pt/Rd > ";in$
  340. 60080 :
  341. 60090 if in$="l" then gosub 10000
  342. 60100 if in$="v" then gosub 50000
  343. 60105 if in$="p" then gosub 51000
  344. 60110 if in$="r" then gosub 52000
  345. 60120 :
  346. 60130 :
  347. 60200 goto 60060
  348. 60210 :
  349.  
  350. ready.
  351.  
  352.